package cn.xzqwjw.taskmanager.service;

import cn.xzqwjw.taskmanager.domain.pojo.UlFile;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

/**
 * @author rush
 */
public interface UlFileService extends IService<UlFile> {

  // ========== 文件上传下载功能 ==========

  /**
   * 上传单个文件到本机服务器，返回该文件的url
   *
   * @param idAdmin      上传者的id
   * @param fileNameShow 用于显示的文件名
   * @param file         前端传过来的文件
   * @return 单个文件存放在本机服务器目录的完整路径，包括文件名
   */
  String upload2Local(int idAdmin, int idTask, String fileNameShow, MultipartFile file);

  /**
   * 上传单个文件到本机服务器，返回该文件的url
   *
   * @param idAdmin 上传者id
   * @param files   前端传过来的多个文件
   * @return 单个文件存放在本机服务器目录的完整路径，包括文件名
   */
  String upload2LocalMulti(int idAdmin, int idTask, MultipartFile[] files);

  /**
   * 根据文件uuid下载文件
   *
   * @param response 包含下载请求的 HttpServletResponse
   * @param uuid     要下载的文件的uuid
   */
  void downloadAsStream(HttpServletResponse response, String uuid);

  /**
   * 通过 ResponseEntity 实现封装 ResponseEntity，将文件流写入body中
   * 这里注意一点，文件的格式需要根据具体文件的类型来设置，一般默认为 application/octet-stream
   * 文件头中设置缓存以及文件的名字，文件的名字写入了，就可以避免出现文件随机产生名字，而不能识别的问题
   *
   * @param uuid 要下载的文件的uuid
   * @return 返回给 controller 用于输出的 ResponseEntity<InputStreamResource>
   */
  ResponseEntity<InputStreamResource> downloadAsResponseEntity(String uuid);

  /**
   * 以流的形式显示图像文件
   *
   * @param response  包含下载请求的 HttpServletResponse
   * @param uuid      要显示的图像文件的uuid
   * @param flagThumb 1，显示缩略图，0，显示原图
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  byte[] showImgAsStream(HttpServletResponse response, String uuid, Boolean flagThumb);

  // ==================== 文件管理功能 ====================

  /**
   * 根据id删除上传的文件
   *
   * @param id 上传的文件id
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String delById(int id);

  /**
   * 根据uuid删除上传的文件
   *
   * @param uuid 上传的文件的 uuid
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String delByUuid(String uuid);

  /**
   * 修改上传的文件的信息
   *
   * @param file 要修改的文章对象
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String modifyAll(UlFile file);

  /**
   * 修改上传的文件的 tag、file_name、remark
   *
   * @param id         要修改的文件id
   * @param paramsJson json格式参数
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String patchByParams(int id, String paramsJson);

  /**
   * 根据id得到一个上传的文件的信息
   *
   * @param id 要查询的id
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String queryById(int id);

  /**
   * 根据uuid得到一个上传的文件的信息
   *
   * @param uuid 要查询的uuid
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String queryByUuid(String uuid);

  /**
   * 分页查询所有管理员上传到服务器上的文件
   *
   * @param pageCurrent 当前页数
   * @param pageSize    每页条数
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String listPage(int pageCurrent, int pageSize);

  /**
   * 得到某任务所有附件
   *
   * @return 返回给 controller 用于输出 response 的 json 格式的字符串
   */
  String listAll(int idTask);

}
